package com.bywlkjs.common.util;

import lombok.SneakyThrows;

import java.io.*;
import java.lang.reflect.Field;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.HashMap;

/**
 * 用来获取响应正文
 * @author 方某人
 */
public class WebSentUtil {

    /**
     * Object转对象
     * @param obj
     * @return
     * @throws IllegalAccessException
     */
    @SneakyThrows
    public static HashMap<String, Object> getObjectToMap(Object obj) {
        HashMap<String, Object> map = new HashMap<String, Object>();
        Class<?> clazz = obj.getClass();
        System.out.println(clazz);
        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            String fieldName = field.getName();
            Object value = field.get(obj);
            if (value == null){
                value = "";
            }
            map.put(fieldName, value);
        }
        return map;
    }

    private static String getURLEncoderString(String str) {
        String result = "";
        if (null == str) {
            return "";
        }
        try {
            result = java.net.URLEncoder.encode(str, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return result;
    }

    private static String getURLDecoderString(String str) {
        String result = "";
        if (null == str) {
            return "";
        }
        try {
            result = java.net.URLDecoder.decode(str, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 参数转换
     *
     * @return
     */
    private static StringBuilder oparetionUrlParam(HashMap<String,Object> params) {
        StringBuilder resultBuilder = new StringBuilder();
        for (String key : params.keySet()) {
            resultBuilder.append(key + "=" + getURLEncoderString(params.get(key).toString()) + "&");
        }
        resultBuilder.deleteCharAt(resultBuilder.length() - 1);
        return resultBuilder;
    }


    /**
     * 以GET请求同步发送请求给给定URL
     * @param url
     * @return 响应正文
     */
    public static String sendGet(String url) {
        String paramsString=url;
        var request =
                HttpRequest.newBuilder()
                        .uri(URI.create(paramsString))
                        .GET()
                        .build();
        var client = HttpClient.newHttpClient();
        HttpResponse<String> response = null;
        try {
            response = client.send(
                    request,
                    HttpResponse.
                            BodyHandlers.ofString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        String result = response.body();
        return result;
    }

    /**
     * 以GET请求同步发送请求给给定URL
     * 通过Map生成请求参数
     * @param url
     * @param params
     * @return
     */
    public static String sendGet(String url, HashMap<String, Object> params) {
        String paramsString=url+"?"+ oparetionUrlParam(params);
        var request =
                HttpRequest.newBuilder()
                .uri(URI.create(paramsString))
                .GET()
                .build();
        var client = HttpClient.newHttpClient();
        HttpResponse<String> response = null;
        try {
            response = client.send(
                    request,
                    HttpResponse.
                            BodyHandlers.ofString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        String result = response.body();
        return result;
    }

    /**
     * 以GET请求同步发送请求给给定URL
     * 通过映射指定对象的get()方法来生成请求参数
     * @param url
     * @param obj
     * @return
     */
    public static String sendGet(String url, Object obj){
        return sendGet(url,getObjectToMap(obj));
    }


    /**getFile(...)方法的中间件*/
    private static byte[] readInputStream(InputStream inStream) throws Exception{
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        //创建一个Buffer字符串
        byte[] buffer = new byte[1024];
        //每次读取的字符串长度，如果为-1，代表全部读取完毕
        int len = 0;
        //使用一个输入流从buffer里把数据读取出来
        while( (len=inStream.read(buffer)) != -1 ){
            //用输出流往buffer里写入数据，中间参数代表从哪个位置开始读，len代表读取的长度
            outStream.write(buffer, 0, len);
        }
        //关闭输入流
        inStream.close();
        //把outStream里的数据写入内存
        return outStream.toByteArray();
    }

    /**获取网络图片*/
    public static void getFile(URL url,String filePath) {
        //打开链接
        HttpURLConnection conn = null;
        try {
            conn = (HttpURLConnection)url.openConnection();

        //设置请求方式为"GET"
        conn.setRequestMethod("GET");
        //超时响应时间为5秒
        conn.setConnectTimeout(5 * 1000);
        //通过输入流获取图片数据
        InputStream inStream = conn.getInputStream();
        //得到图片的二进制数据，以二进制封装得到数据，具有通用性
        byte[] data = readInputStream(inStream);
        //new一个文件对象用来保存图片，默认保存当前工程根目录
        File imageFile = new File(filePath);
        //创建输出流
        FileOutputStream outStream = new FileOutputStream(imageFile);
        //写入数据
        outStream.write(data);
        //关闭输出流
        outStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        }

    public static void getFile(String url,String filePath){
        try {
            getFile(new URL(url),"D:/CC.png");
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

}
